#结论
没有使用区域 ID
导致的
IPv6 中的
fe80::/10
是专门为单个网络链路设计的,这些地址仅存在单个网络链路,不能被路由到互联网上,而当存在多个网络链路时,这个地址就可能重复,也正是如此存在的了区域 ID 用来区分同一个链路本地地址是那个接口的实例
在 Debian 等 Linux 系统上区域 ID 为网卡名称,例如 fe80::62be:b4ff:fe0c:b5c0%docker0
在 Windows 则是网卡序号,例如:fe80:0:0:0:62be:b4ff:fe0c:b5c0%7
#过程
开启后软路由无法连接上一级路由器局域网的 IPv6 地址,这导致 Docker 创建的容器 IPv6 DNS 解析全部失效,无法访问网络
ping fe80::62be:b4ff:fe0c:b5c0
# 64 bytes from fe80::62be:b4ff:fe0c:b5c0%eth0: icmp_seq=9 ttl=64 time=0.027 ms
ping fe80::d6da:21ff:fe65:cde6
# From fe80::42:25ff:fe6f:cdda%docker0 icmp_seq=2 Destination unreachable: Address unreachable
可以看到上一级路由器的 IPv6 地址 fe80::d6da:21ff:fe65:cde6
进入了作用域为 docker0
的网卡
使用 ip addr
查询网卡 docker0
状态
ip addr show docker0
得到网卡状态
7: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether ██:██:██:██:██:██ brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 2001:db8:1::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::42:25ff:fe6f:cdda/64 scope link
valid_lft forever preferred_lft forever
inet6 fe80::1/64 scope link
valid_lft forever preferred_lft forever
由上可知 docker0
分配了三个 IPv6 的范围,分别是
2001:db8:1::1/64
fe80::42:25ff:fe6f:cdda/64
fe80::1/64
这导致来自在三个范围内的地址通信全部被路由到了 docker0
上
然后再使用 ip addr
查询 eth0
的状态
ip addr show eth0
得到网卡状态
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ██:██:██:██:██:██ brd ff:ff:ff:ff:ff:ff
altname enp2s0
inet 192.168.██.██/24 brd 192.168.██.██ scope global eth0
valid_lft forever preferred_lft forever
inet6 240█:████:████:████:████:████:████:████/64 scope global dynamic mngtmpaddr
valid_lft 3185sec preferred_lft 3168sec
inet6 fe80::62be:b4ff:fe0c:b5c0/64 scope link
valid_lft forever preferred_lft forever
eth0
网卡只存在一个本地 IPv6 范围 fe80::62be:b4ff:fe0c:b5c0
,这是不能 ping 通的原因,也是这个原因导致 DNS 查询失败。
在指定区域域 id 后再 ping 才可以正常访问
ping fe80::d6da:21ff:fe65:cde6%eth0